package org.db.ui;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.SortedSet;

import javax.swing.table.AbstractTableModel;

import org.db.dao.KruemmungslinienDAO;
import org.db.dao.Uebergangsbogen;

public class KruemmungslinienTableModel extends AbstractTableModel {

	/**
	 * 
	 */
	private static final long serialVersionUID = -9090229507848048699L;

	private List<KruemmungslinienDAO> data = new ArrayList<KruemmungslinienDAO>();

	private DecimalFormat format1 = new DecimalFormat("0.000");

	private DecimalFormat format2 = new DecimalFormat("0");

	private DecimalFormat format3 = new DecimalFormat("0.0000");

	Class<?>[] types = new Class[]{java.lang.String.class,
			java.lang.Double.class, java.lang.Double.class,
			java.lang.Integer.class, java.lang.Integer.class,
			java.lang.Double.class, java.lang.String.class,
			java.lang.Double.class};

	@Override
	public int getColumnCount() {
		return 8;
	}

	@Override
	public int getRowCount() {
		return data.size();
	}

	@Override
	public Object getValueAt(int row, int column) {
		switch (column) {
			case 0 :
				return data.get(row).getElement();
			case 1 :
				return format1.format(data.get(row).getStationierungInMeter());
			case 2 :
				return format1.format(data.get(row)
						.getEndstationierungInMeter());
			case 3 :
				return data.get(row).getRadius() == 0 ? "" : format1
						.format(data.get(row).getRadius());
			case 4 :
				return data.get(row).getUeberhoehung() == 0 ? "" : format2
						.format(data.get(row).getUeberhoehung());
			case 5 :
				return data.get(row).getRp() == 0 ? "" : format3.format(data
						.get(row).getRp());
			case 6 :
				return data.get(row).getUebergangsbogen() == Uebergangsbogen.NONE
						? ""
						: data.get(row).getUebergangsbogen();
			case 7 :
				return data.get(row).getLaengeUeBogen() == 0 ? "" : format1
						.format(data.get(row).getLaengeUeBogen());
			default :
				return "";

		}
	}

	@Override
	public void setValueAt(Object value, int rowIndex, int columnIndex) {
		KruemmungslinienDAO daoK = data.get(rowIndex);
		try {
			switch (columnIndex) {
				case 0 :
					daoK.setElement((String) value);
					break;
				case 1 :
					daoK.setStationierungInMeter((Double) value);
					break;
				case 2 :
					daoK.setEndstationierungInMeter(format1.parse(
							value.toString()).doubleValue());
					break;
				case 3 :
					daoK.setRadius((Double) value);
					break;
				case 4 :
					daoK.setUeberhoehung((Integer) value);
					break;
				case 5 :
					daoK.setRp((Double) value);
					break;
				case 6 :
					daoK.setUebergangsbogen((Uebergangsbogen) value);
					break;
				case 7 :
					daoK.setLaengeUeBogen((Double) value);
					break;
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		fireTableCellUpdated(rowIndex, columnIndex);
	}

	@Override
	public String getColumnName(int column) {
		switch (column) {
			case 0 :
				return "Element";
			case 1 :
				return "Stationierung";
			case 2 :
				return "Endstationierung";
			case 3 :
				return "Radius";
			case 4 :
				return "Überhöhung";
			case 5 :
				return "Beta";
			case 6 :
				return "UeBogen-ID";
			case 7 :
				return "Länge Ü-Bogen";
			default :
				return "";
		}
	}

	@Override
	public boolean isCellEditable(int row, int column) {
		return false;
	}

	@Override
	public Class<?> getColumnClass(int columnIndex) {
		return types[columnIndex];
	}

	public void addKruemmungslinienElement(KruemmungslinienDAO dao) {
		data.add(dao);
		Collections.sort(data);
		fireTableDataChanged();
	}

	public void addKruemmungslinienElemente(SortedSet<KruemmungslinienDAO> daos) {
		data.addAll(daos);
		fireTableDataChanged();
	}

	public void replaceKruemmungslinienElement(KruemmungslinienDAO oldDao,
			KruemmungslinienDAO newDao) {
		data.set(data.indexOf(oldDao), newDao);
		fireTableDataChanged();
	}

	public KruemmungslinienDAO getElementAtRow(int row) {
		if (row < data.size()) {
			return data.get(row);
		}
		return null;
	}

	public void removeKruemmungslinienElement(KruemmungslinienDAO dao) {
		data.remove(dao);
		fireTableDataChanged();
	}

	public KruemmungslinienDAO removeKruemmungslinienElement(int rowIndex) {
		KruemmungslinienDAO removedDAO = data.remove(rowIndex);
		fireTableDataChanged();
		return removedDAO;
	}

	public List<KruemmungslinienDAO> getKruemmungslinienElemente() {
		return data;
	}

	public void refresh() {
		fireTableDataChanged();
	}

	// public void addUeberhoehungslinienElement(UeberhoehungslinienDAO dao){
	// ueberhoehungslinienElemente.add(dao);
	// Collections.sort(kruemmungslinienElemente);
	// fireTableDataChanged();
	// }
	//
	// public void
	// addUeberhoehungslinienElemente(SortedSet<UeberhoehungslinienDAO> daos){
	// ueberhoehungslinienElemente.addAll(daos);
	// fireTableDataChanged();
	// }
	//
	// private UeberhoehungslinienDAO
	// getCorrespondingUeberhoehungslinienElement(KruemmungslinienDAO dao){
	// if(dao.getElement().equals("Kreisbogen")){
	// for(UeberhoehungslinienDAO ue : ueberhoehungslinienElemente){
	// if(ue.getStationierungInMeterUe() == dao.getStationierungInMeter() &&
	// ue.getEndstationierungInMeterUE() == dao.getEndstationierungInMeter()){
	// return ue;
	// }
	// }
	// }
	// return null;
	// }
	//
	// private void setCorrespondingUeberhoehungInMM(KruemmungslinienDAO daoK,
	// int ueberhoehungInMM){
	// UeberhoehungslinienDAO daoU =
	// getCorrespondingUeberhoehungslinienElement(daoK);
	// if(daoU != null){
	// daoU.setUeberhoehungInMM(ueberhoehungInMM);
	// }
	// }
	//
	// private String getCorrespondingUeberhoehungInMM(KruemmungslinienDAO
	// daoK){
	// UeberhoehungslinienDAO daoU =
	// getCorrespondingUeberhoehungslinienElement(daoK);
	// if(daoU != null){
	// return format2.format(daoU.getUeberhoehungInMM());
	// }
	// return "";
	//
	// }

	public boolean isEmpty() {
		return data.isEmpty();
	}

}
